home *** CD-ROM | disk | FTP | other *** search
- /*****************************************************************************
-
- mac_prefs.c: Copyright (c) Kevin Hammond 1993. All rights reserved.
-
- Preference file handling
-
- *****************************************************************************/
-
- #include "mac.h"
-
- #pragma segment Prefs
-
- extern short preludevolref; /* vrefnum for the Prelude */
- extern long preludedirID; /* HFS dirid for the Prelude */
- extern maxEvidLevel, HeapPC; /* Evidence level and heap % settings */
- extern OSType preftype; /* Type of preference files */
-
- extern char *PreludeName, *safemalloc();
-
- extern Boolean checkFileExists();
-
- Boolean HiddenPrefsChanged = FALSE;
- char *PrefsName;
- static short prefsvolref;
- static long prefsdirID;
- static Boolean prefsvolset = FALSE;
-
-
- /*
- Structures defining legal types of preference:
- Int, Bool, String.
-
- The distinction between "set" and "save" values is needed if
- we are to save new settings without changing the current
- settings. This is necessary for the num_ settings which are
- used to define buffer sizes.
- */
-
-
- struct Prefs
- {
- int *setvalue; /* Value to set on startup */
- int *savevalue; /* Value to save to file */
- char *tag;
- };
-
- struct BPrefs
- {
- int *value;
- char *tag;
- Boolean HiddenPref;
- };
-
-
- struct SPrefs
- {
- char **value;
- char *tag;
- };
-
-
- /*
- Numeric Preferences and their tags in the Preferences file.
- */
-
- static struct Prefs Prefs[] =
- {
- {&maxEvidLevel, &maxEvidLevel, "ED"},
- {&HeapPC, &HeapPC, "HP"},
- {&num_stack, &Num_stack, "NS"},
- {&num_name, &Num_name, "NN"},
- {&num_classes, &Num_classes, "NC"},
- {&num_insts, &Num_insts, "NI"},
- {&num_tycon, &Num_tycon, "NT"},
- {&num_tyvars, &Num_tyvars, "NV"},
- {&num_addrs, &Num_addrs, "NA"},
- {&num_offsets, &Num_offsets, "NO"},
- {&num_files, &Num_files, "NF"},
- {&num_modules, &Num_modules, "NM"},
- {&num_tuples, &Num_tuples, "NP"},
- {&num_fixups, &Num_fixups, "NU"},
- {&num_indexes, &Num_indexes, "NX"},
- {&num_syntax, &Num_syntax, "NY"},
- {&num_text, &Num_text, "NZ"},
- {&num_selects, &Num_selects, "NL"}
- };
-
-
- /*
- Boolean Preferences,their tags in the Preferences file
- and their default value.
-
- Think C needs (int *) coercions.
- */
-
-
- #if !THINKC
- static struct BPrefs BPrefs[] =
- {
- {&showStats, "ST", TRUE},
- {&gcMessages, "GC", FALSE},
- {&addType, "ET", FALSE},
- {&literateScripts, "LI", FALSE},
- {&coerceNumLiterals, "HN", FALSE},
- {&showDicts, "SD", FALSE},
- {&traceEval, "TR", FALSE},
- {&literateErrors, "LE", TRUE},
- {&AutoLoad, "AL", TRUE},
- {&MultiTasking, "MT", FALSE},
- {&anyEvidence, "EA", TRUE},
- {&silentEvFail, "ES", TRUE},
- {&andorOptimise, "OB", TRUE},
- {&failOnError, "FE", TRUE},
- {&catchAmbigs, "TA", FALSE},
- {&useConformality, "PC", TRUE},
- {&kindExpert, "KE", FALSE},
- {&overSingleton, "OS", TRUE}
- };
-
- #else
-
- static struct BPrefs BPrefs[] =
- {
- {(int *) &showStats, "ST", FALSE},
- {(int *) &gcMessages, "GC", FALSE},
- {(int *) &addType, "ET", FALSE},
- {(int *) &literateScripts, "LI", FALSE},
- {(int *) &coerceNumLiterals, "HN", FALSE},
- {(int *) &showDicts, "SD", FALSE},
- {(int *) &traceEval, "TR", FALSE},
- {(int *) &literateErrors, "LE", FALSE},
- {(int *) &AutoLoad, "AL", FALSE},
- {(int *) &MultiTasking, "MT", FALSE},
- {(int *) &anyEvidence, "EA", TRUE},
- {(int *) &silentEvFail, "ES", TRUE},
- {(int *) &andorOptimise, "OB", TRUE},
- {(int *) &failOnError, "FE", TRUE},
- {(int *) &catchAmbigs, "TA", FALSE},
- {(int *) &useConformality, "PC", TRUE},
- {(int *) &kindExpert, "KE", FALSE},
- {(int *) &overSingleton, "OS", TRUE}
- };
- #endif
-
- /*
- static struct SPrefs SPrefs[] =
- {
- {&PreludeName, "PR"}
- };
- */
-
-
- /*
- Initialise "save" values for preferences to be the
- original value for those preferences.
- */
-
- InitPrefs()
- {
- int i;
- for(i=0;i < sizeof(Prefs)/sizeof(struct Prefs); ++i)
- Prefs[i].savevalue = Prefs[i].setvalue;
- }
-
- /*
- Save the user's preferences. Preferences are saved in the
- same file that they were taken from, so preferences in the
- startup directory are overwritten before system-wide preferences.
- */
-
- SavePrefs()
- {
- int i;
- FILE *prefs;
- char buff[256];
-
- OSErr resultcode;
-
- /* If the preference volume is unset, locate it */
- if(!prefsvolset)
- {
- resultcode = FindFolder(kOnSystemDisk, kPreferencesFolderType, kCreateFolder,
- &prefsvolref, &prefsdirID);
-
- if (resultcode != noErr)
- {
- Error("I/O ","Can't find Preferences folder");
- return;
- }
- else
- prefsvolset = TRUE;
- }
-
- resultcode = hcreate(PrefsName,prefsvolref,prefsdirID,creator,preftype);
-
- if ( (resultcode != noErr) && (resultcode != dupFNErr) )
- {
- Error("I/O ","Can't create Preferences file");
- return;
- }
-
- (void) HSetVol(NIL,prefsvolref,prefsdirID);
-
- /* Now write to the preferences file proper */
- if((prefs = fopen(PrefsName,"w"))==NULL)
- Error("I/O ","Can't write to Preferences file");
-
- else
- {
- for(i=0;i < sizeof(Prefs)/sizeof(struct Prefs); ++i)
- {
- sprintf(buff,"%s: %d\n",Prefs[i].tag,*(Prefs[i].savevalue));
- fputc(strlen(buff),prefs);
- fputs(buff,prefs);
- }
-
- for(i=0;i < sizeof(BPrefs)/sizeof(struct BPrefs); ++i)
- {
- sprintf(buff,"%s: %d\n",BPrefs[i].tag,*(BPrefs[i].value)?TRUE:FALSE);
- fputc(strlen(buff),prefs);
- fputs(buff,prefs);
- }
-
- #if 0
- for(i=0;i < sizeof(SPrefs)/sizeof(struct SPrefs); ++i)
- {
- sprintf(buff,"%s: %s\n",SPrefs[i].tag,*(SPrefs[i].value));
- fputc(strlen(buff),prefs);
- fputs(buff,prefs);
- }
- #endif
-
- fclose(prefs);
- FlushVol(NIL,prefsvolref);
- HiddenPrefsChanged = FALSE;
- }
- resetdir();
- }
-
-
-
- /*
- Restore the user's preferences file. Preference is given to the
- file in the startup folder, or failing that to the one in the
- Preferences folder.
- */
-
- RestorePrefs(toggles)
- int toggles;
- {
- if(checkFileExists(PrefsName,preludevolref,preludedirID))
- {
- dorestoreprefs(PrefsName,preludevolref,preludedirID,toggles);
- prefsvolref = preludevolref;
- prefsdirID = preludedirID;
- prefsvolset = TRUE;
- }
- else
- {
- if (FindFolder(kOnSystemDisk,kPreferencesFolderType,
- kCreateFolder,&prefsvolref,&prefsdirID) == noErr)
- {
- if(checkFileExists(PrefsName,prefsvolref,prefsdirID))
- dorestoreprefs(PrefsName,prefsvolref,prefsdirID,toggles);
- prefsvolset = TRUE;
- }
- }
- }
-
-
- int restoreintpref(tag,ival)
- char *tag;
- int ival;
- {
- int i;
-
- if(!HiddenPrefsChanged)
- for(i=0; i < sizeof(Prefs)/sizeof(struct Prefs); ++i)
- if(strcmp(tag,Prefs[i].tag)==0)
- {
- *(Prefs[i].setvalue) = *(Prefs[i].savevalue) = ival;
- return(TRUE);
- }
- return(FALSE);
- }
-
- int restoreboolpref(tag,ival)
- char *tag;
- int ival;
- {
- int i;
-
- for(i=0; i < sizeof(BPrefs)/sizeof(struct BPrefs); ++i)
- if(strcmp(tag,BPrefs[i].tag)==0)
- {
- if(HiddenPrefsChanged && BPrefs[i].HiddenPref)
- return(FALSE);
- else
- {
- *(BPrefs[i].value) = ival? TRUE: FALSE;
- return(TRUE);
- }
- }
- return(FALSE);
- }
-
-
-
- int restorestringpref(tag,value)
- char *tag, *value;
- {
- #if 0
- int i;
-
- for(i=0; i < sizeof(SPrefs)/sizeof(struct SPrefs); ++i)
- if(strcmp(tag,SPrefs[i].tag)==0)
- {
- *(SPrefs[i].value) = safemalloc(strlen(value)+1);
- strcpy(*(SPrefs[i].value),value);
- return(TRUE);
- }
- #endif
- return(FALSE);
- }
-
-
- /*
- Restore a preference from a line.
- */
-
- restorepref(pref,toggles)
- char pref[];
- int toggles;
- {
- char tag[256], strval[256];
- int i=0, j=0, ival;
-
- while(pref[j] != '\0' && pref[j] != ':')
- tag[i++] = pref[j++];
- tag[i] = '\0';
-
- if(pref[j]==':')
- j++;
-
- while(isspace(pref[j]))
- j++;
-
- i = 0;
- while(pref[j] != '\0' && pref[j] != '\n')
- strval[i++] = pref[j++];
- strval[i] = '\0';
-
- ival = atoi(strval);
-
- if(!restoreintpref(tag,ival))
- if(!(toggles && restoreboolpref(tag,ival)))
- restorestringpref(tag,strval);
- }
-
-
- /*
- Save the hidden preferences, e.g. those set in memory or
- arcana dialogs.
- */
-
- SaveHiddenPrefs()
- {
- if(HiddenPrefsChanged)
- {
- /* Restore non-hidden preferences to saved state, then save all */
- RestorePrefs(TRUE);
- SavePrefs();
- }
- }
-
-
-